﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpCommonEdit.h"
#include "IGraphicsNodeReference.h"

namespace gcmp
{
    class IUiView;
    class IElement;
    class IActionInputEventArgs;
    class IPlane;
    class IControlDefinition;
    class IPickFilter;
    class IDocument;

    /// \brief 镜像操作的Behavior，方便定制镜像Action的行为。
    /// 
    /// 未实现此接口时，镜像Action行为按照默认方式执行。
    class GCMP_COMMON_EDIT_EXPORT IActionMirrorBehavior
    {
    public:
        /// \brief 创建ActionInputDialog内容。
        /// \param[out] title ActionInputDialog的标题
        /// \param[out] inputItems ActionInputDialog中的Item
        /// \return 创建成功则返回true，否则返回false
        virtual bool DefineInputDialog(std::wstring &title, std::vector<OwnerPtr<IControlDefinition>>& inputItems) = 0;

        /// \brief ActionInputDialog的输入响应，在输入发生变化时，会调用。
        /// \param pArgs ActionInputDialog的事件信息
        virtual void OnInputEvent(IActionInputEventArgs* pArgs) = 0;

        /// \brief 镜像轴是否有效，判断所选轴是否合适，不合适则重新选择。
        /// \param[in] pCurrentView 镜像操作所在的视图
        /// \param[in] mirrorMatrix 镜像的矩阵
        /// \param[in] nodeToBeMirrored 需要镜像的对象
        /// \return 如果镜像轴有效，则返回true；否则，返回false，重新进入获取镜像轴。
        virtual bool ValidateMirrorAxis(IUiView* pCurrentView, const Matrix4d& mirrorMatrix, const GraphicsNodeReferenceOwnerPtrVector& nodeToBeMirrored) = 0;

        /// \brief 对元素做镜像操作
        /// \param[in] pCurrentView 镜像操作所在的视图
        /// \param[in] mirrorMatrix 镜像的矩阵
        /// \param[in] nodeToBeMirrored 需要镜像的对象
        virtual void OnMirrorFinished(IUiView* pCurrentView, const Matrix4d& mirrorMatrix, const GraphicsNodeReferenceOwnerPtrVector& nodeToBeMirrored) = 0;

        /// \brief 镜像是拾取轴线，还是绘制轴线
        /// \return 如果是拾取轴线，返回true；否则返回false。
        virtual bool IsPickAxis() const = 0;

        /// \brief 镜像是否拷贝对象
        /// \return 如果拷贝对象，返回true；否则返回false。
        virtual bool IsCopyElemments() const = 0;

        /// \brief 获取将被镜像的物体拾取过滤器
        ///
        /// 如果先启动镜像命令，再拾取待镜像物体，那么此接口将有效
        /// \param[in] pDocument 镜像操作所在的文档
        /// \return 拾取过滤器
        virtual OwnerPtr<IPickFilter> GetMirrorObjectPickFilter(IDocument* pDocument) = 0;

        /// \brief 获取将镜像轴拾取过滤器
        /// \param[in] pDocument 镜像操作所在的文档
        /// \param[in] excludeNodeReferences 不需要镜像的对象
        /// \return 拾取过滤器
        virtual OwnerPtr<IPickFilter> GetMirrorAxisPickFilter(IDocument* pDocument, const gcmp::GraphicsNodeReferenceOwnerPtrVector& excludeNodeReferences) = 0;
    
    public:
        /// \brief 析构函数
        virtual ~IActionMirrorBehavior(){}
    };
}
